package com.ctw.mall.service.impl;

import com.ctw.mall.dao.ProductMapper;
import com.ctw.mall.pojo.Product;
import com.ctw.mall.service.ICategoryService;
import com.ctw.mall.service.IProductService;
import com.ctw.mall.vo.ProductDetailVo;
import com.ctw.mall.vo.ProductVo;
import com.ctw.mall.vo.ResponseVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import static com.ctw.mall.enums.ProductStatusEnum.DELETE;
import static com.ctw.mall.enums.ProductStatusEnum.OFF_SALE;
import static com.ctw.mall.enums.ResponseEnum.PRODUCT_OFF_SALE_OR_DELETE;

@Service
@Slf4j
public class ProductServiceImpl  implements IProductService {

    @Autowired
    private ICategoryService categoryService;

    @Autowired
    private ProductMapper productMapper;

    @Override
    public ResponseVo<PageInfo> list(Integer categoryId, Integer pageNum, Integer pageSize) {
        Set<Integer> categoryIdSet = new HashSet<>();

        if(categoryId != null) {
            //若不添加判断，会一直添加自身（null），一直不为null
            categoryService.findSubCategoryId(categoryId, categoryIdSet);
            //查完商品将自身添加
            categoryIdSet.add(categoryId);
        }


        //引入分页组件之后的代码
        //插件的原理：执行的过程中，做了个拦截器，分析了sql语句
        PageHelper.startPage(pageNum,pageSize);
        //查询商品的详细信息
        //若此处不对categoryIdSet的值赋值为null，就在xml文件当中修改sql语句的判断标准为大于0才进入查询其父子类目的商品要查出来
        //第二种方法:categoryIdSet.size()==0?null:categoryIdSet
        //采取第一种，对于集合习惯于对集合set是否包含了元素判断是不是空,而不是null
        List<Product> productList = productMapper.selectByCategoryIdSet(categoryIdSet);
        List<ProductVo> productVoList = productList.stream()
                .map(e -> {
                    ProductVo productVo = new ProductVo();
                    BeanUtils.copyProperties(e, productVo);
                    return productVo;
                })
                .collect(Collectors.toList());

        //将数据库中查到的数据当做构造方法的参数传入
        PageInfo pageInfo = new PageInfo<>(productList);
        pageInfo.setList(productVoList);
        return ResponseVo.success(pageInfo);
    }

    /**
     * 查询商品详细信息
     * @param productId
     * @return
     */
    @Override
    public ResponseVo<ProductDetailVo> detail(Integer productId) {
        Product product = productMapper.selectByPrimaryKey(productId);

        //在判断时只对确定性的条件判断
        if(product.getStatus().equals(OFF_SALE.getCode())
                || product.getStatus().equals(DELETE.getCode())){
            return ResponseVo.error(PRODUCT_OFF_SALE_OR_DELETE);
        }

        ProductDetailVo productDetailVo = new ProductDetailVo();
        BeanUtils.copyProperties(product,productDetailVo);
        //铭感数据处理
        //大于100，显示100，小于则显示本来数据
        productDetailVo.setStock(productDetailVo.getStock()>100? 100 :productDetailVo.getStock());
        return ResponseVo.success(productDetailVo);
    }
}
